from django_filters import rest_framework as filters # 可能不支持逻辑或运算
from home.models import AxfGoods


class GoodsFilter(filters.FilterSet): # 自定义过滤器类。from https://zhuanlan.zhihu.com/p/110060840，不同于笔记中的链接，笔记中是第二篇，这里是第一篇
    class Meta:
        model=AxfGoods # 指定模型
        fields=['categoryid'] # 要过滤的字段，默认的运算是精确判等
    # 接口中以GET请求传入的参数的名是在vue中定义好的(typeid、childcid、order_rule，详细在market/views.py中继承自APIView的GoodsListView类中)，和数据库中的字段名不同，所以要自定义，即将它们关联起来
    typeid=filters.CharFilter(field_name='categoryid',lookup_expr='exact') # fields无法满足需求时，可以自定义。等号左面是自定义的查询字段名(任意起名)，field_name是这个自定义字段关联的模型中的字段名(过滤器不是从数据库查询数据，而是针对queryset)，lookup_expr是运算符，exact是精确判等(是默认运算符，可以不写)
    childcid=filters.CharFilter(field_name='childcid',method='filter_child_type') # lookup_expr无法满足需求时，可以自定义查询方法，method是方法名
    order_rule=filters.CharFilter(field_name='order_rule',method='order_goods')

    def filter_child_type(self,queryset,name,value): # 自定义查询方法。前两个参数是固定写法，name是自定义的查询字段名，value是自定义的查询字段的要查的值，返回查询结果集(queryset)，URL中传name和value的值
        # childcid是闪送超市左面大类下的子类的id，详细在market/views.py中继承自APIView的GoodsListView类中
        if int(value)>0: # 说明选了大类中的某个具体分类。默认不分类(即选中全部分类)时为0
            return queryset.filter(childcid=int(value)) # 运算符参照Django中ORM模型中filter里的写法，格式是要查的字段名__运算符=要查的内容，要查的字段名是模型中的字段名
        return queryset # 为0时直接返回

    def order_goods(self,queryset,name,value): # 过滤器中也可以做排序。详细在market/views.py中继承自APIView的GoodsListView类中
        value=int(value)
        # 0表示不排序，所以不用对0的情况判断
        if value==1: # 价格升序
            queryset=queryset.order_by('price')
        elif value==2: # 价格降序
            queryset=queryset.order_by('-price')
        elif value==3: # 销量升序
            queryset=queryset.order_by('productnum')
        elif value==4: # 销量降序
            queryset=queryset.order_by('-productnum')
        return queryset